package org.jmpo;

/**
 * При использовании в maven плагина surfire версии не менее 3.0.0
 * будут запускаться любые методы, которые отмечены аннотацией @Test,
 * вне зависимости от их названия. Sufire соберёт и передаст в jUnit5
 * все классы, которые находятся в папке src/test/java.
 * 
 * Аннотация @Disable позволяет отклонить от исполнения тест,
 * например потому что в самом тесте содержится ошибка.
 * В этом случае surfire явно укажет, что тест был пропущен.
 * --> Искать в surefire-reports/.*\.xml
 */

// аннотация @Test
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Disabled;
// использование assertEquals без квалификтора класса Assertions
import static org.junit.jupiter.api.Assertions.assertEquals;

public class SimpleMethodTest {
    /**
     * Определяем метод, который должен быть вызван в фазе тестирования,
     * и отмечаем его аннотацией @Test
     */
    @Test
    public void zeroSquareStaticTest() {
        // исходные данные теста
        final int zero = 0; 
        final int expect = 0;

        // вызов тестируемого метода
        final var actual = SimpleMethod.square(zero);
       
        // проверяем действительное на совпадение с ожидаемым
        assertEquals(expect, actual);
    }

    @Test
    public void unitySquareStaticTest() {
        final int unity = 1;
        final int expect = 1;
        final var actual = SimpleMethod.square(unity);
        assertEquals(expect, actual);
    }

    @Test
    public void smallIntegerSquareStaticTest() {
        final int smallInt = 1024;
        final int expect   = 1048576;
        final var actual = SimpleMethod.square(smallInt);
        assertEquals(expect, actual);
    }

    /**
     * Плохой тест!
     * В данном тесте при возведении 1048576 в квадрат
     * происходит переполнение! В результе в actual 
     * попдает значение 0. Это значение далее сравнивается
     * со значением long. 
     */
    @Disabled ("bad test with overflow")
    @Test
    public void badBigIntegerSquareStaticTest() {
        final int bigInt = 1048576;
        final long expect = 1099511627776l;
        final var actual = SimpleMethod.square(bigInt);
        assertEquals(expect, actual);
    }

    /**
     * Хороший тест!
     * Учитывая переполенение, мы ожидаем результат 0.
     */
    @Disabled ("intentionally disabled")
    @Test
    public void goodBigIntegerSquareStaticTest() {
        final int bigInt = 1048576;
        final int expect = 0; //правильный тип ожидаемого результата
        final var actual = SimpleMethod.square(bigInt);
        assertEquals(expect, actual);
    }

    @Disabled ("intentionally disabled")
    @Test
    public void maxIntSquareStaticTest() {
        final int maxInt = Integer.MAX_VALUE;
        final int expect = 1;
        final var actual = SimpleMethod.square(maxInt);
        assertEquals(expect, actual);
    }
}
